﻿/*!
 * Copyright (c), 上海沃恩信息科技有限公司.
 * All rights reserved.
 * Licensed under BSD (https://www.pittypat.work/bsd.html).
 */

using System;

namespace Pittypat
{
    /// <summary>
    /// 提供对 <see cref="ISystemTokenProvider"/> 的默认实现，以及提供对配置的 <see cref="ISystemTokenProvider"/> 的访问。
    /// </summary>
    sealed class SystemTokenProvider : ISystemTokenProvider
    {
        /// <summary>
        /// 默认的 ISystemTokenProvider 实现对象实例。这是一个只读静态字段。
        /// </summary>
        static readonly SystemTokenProvider Default = new SystemTokenProvider();

        /// <summary>
        /// 初始化 SystemTokenProvider 的新实例。
        /// </summary>
        private SystemTokenProvider()
        {
        }

        /// <summary>
        /// 获取当前系统的系统令牌。总是返回空字符串。
        /// </summary>
        /// <returns>当前系统的系统令牌。</returns>
        string ISystemTokenProvider.GetSystemToken()
        {
            return "";
        }

        // 当前配置的系统令牌提供程序
        static ISystemTokenProvider current = null;

        // 同步对 current 的访问
        static readonly object currentLock = new object();

        /// <summary>
        /// 获取当前配置文件中定义的 <see cref="ISystemTokenProvider"/> 的对象实例。如果配置文件中没有配置，则返回一个默认的实现。
        /// </summary>
        internal static ISystemTokenProvider Current
        {
            get
            {
                if (current == null)
                {
                    lock (currentLock)
                    {
                        if (current == null)
                        {
                            // 实现程序的类型名称
                            var typeName = Configuration.PittypatConfig.Current.SystemTokenProvider;
                            if (!string.IsNullOrEmpty(typeName))
                            {
                                // 查找目标类型
                                var type = Type.GetType(typeName);
                                if (type != null)
                                {
                                    // 根据类型创建对象实例
                                    current = (ISystemTokenProvider)Activator.CreateInstance(type);
                                }
                            }

                            if (current == null)
                            {
                                current = Default;
                            }
                        }
                    }
                }

                return current;
            }
        }
    }
}
